package main

import "fmt"

// 接口中没有任何方法,表示这是一个空接口, 表示没有任何约束
// 任意的类型都可以实现这个接口
type A interface {
}

// 空接口作为方法参数, 接受任意类型(java中的Object)
func show(a interface{}) {
	fmt.Printf("值:%v, 类型: %T\n", a, a)
}

func Print(x interface{}) {
	//x.(type) 只能用在switch语句中.
	switch v := x.(type) {
	case string:
		fmt.Printf("string值:%v, 类型: %T\n", v, v)
	case int:
		fmt.Printf("int值:%v, 类型: %T\n", v, v)
	}
}

func main() {
	//var a A
	//var str = "你好golang"
	////XX 让字符串实现A这个接口
	//a = str
	//// 值:你好golang, 类型: string
	//fmt.Printf("值:%v, 类型: %T\n", a, a)
	//
	//var num = 10
	//a = num
	//fmt.Printf("值:%v, 类型: %T\n", a, a)

	// golang中空接口可可以直接当做任意类型来使用, 可以表示任意类型
	//var a interface{}
	//a = 20
	//fmt.Printf("值:%v, 类型: %T\n", a, a)
	//a = "你好北京"
	//fmt.Printf("值:%v, 类型: %T\n", a, a)
	//a = 3.14
	//fmt.Printf("值:%v, 类型: %T\n", a, a)
	//
	//show("哈哈哈哈...")

	//var m1 = make(map[string]string)
	//m1["name"] = "小明"
	//m1["age"] = "18"
	//fmt.Println(m1)

	//var m1 = make(map[string]interface{})
	//m1["name"] = "小明"
	//m1["age"] = 18
	//fmt.Println(m1)

	var s1 = []interface{}{1, "hello", 3.14}
	fmt.Println(s1)

	// 断言
	var a interface{}
	a = "hello"
	_, ok := a.(string)
	if ok {
		fmt.Println("a是一个string类型")
	} else {
		fmt.Println("类型断言失败")
	}

	Print(a)
	Print(110)
	Print(true)
}
